package com.ruoyi.kong.service.impl;

import java.util.List;
import java.util.Map;

import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.kong.domain.KongxSystemProfile;
import com.ruoyi.common.exception.kong.KongServiceException;
import com.ruoyi.kong.fegin.KongClientService;
import com.ruoyi.kong.mapper.KongxSystemProfileMapper;
import com.ruoyi.kong.service.IKongxSystemProfileService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;

import static com.ruoyi.common.utils.DictUtils.getKongCacheKey;

/**
 * kong配置信息Service业务层处理
 *
 * @author ruoyi
 * @date 2021-08-27
 */
@Service
public class KongxSystemProfileServiceImpl implements IKongxSystemProfileService {
    @Autowired
    private KongxSystemProfileMapper kongxSystemProfileMapper;


    @Autowired
    private RedisCache redisCache;



    /**
     * 查询kong配置信息
     *
     * @param id kong配置信息主键
     * @return kong配置信息
     */
    @Override
    public KongxSystemProfile selectKongxSystemProfileById(Long id) {
        KongxSystemProfile kongxSystemProfile = kongxSystemProfileMapper.selectKongxSystemProfileById(id);
        return kongxSystemProfile;
    }


    /**
     * 查询kong配置信息列表
     *
     * @param kongxSystemProfile kong配置信息
     * @return kong配置信息
     */
    @Override
    public List<KongxSystemProfile> selectKongxSystemProfileList(KongxSystemProfile kongxSystemProfile) {
        return kongxSystemProfileMapper.selectKongxSystemProfileList(kongxSystemProfile);
    }

    /**
     * 新增kong配置信息
     *
     * @param kongxSystemProfile kong配置信息
     * @return 结果
     */
    @Override
    public int insertKongxSystemProfile(KongxSystemProfile kongxSystemProfile) {
        kongxSystemProfile.setCreateTime(DateUtils.getNowDate());
        return kongxSystemProfileMapper.insertKongxSystemProfile(kongxSystemProfile);
    }

    /**
     * 修改kong配置信息
     *
     * @param kongxSystemProfile kong配置信息
     * @return 结果
     */
    @Override
    public int updateKongxSystemProfile(KongxSystemProfile kongxSystemProfile) {
        kongxSystemProfile.setUpdateTime(DateUtils.getNowDate());
        return kongxSystemProfileMapper.updateKongxSystemProfile(kongxSystemProfile);
    }

    /**
     * 批量删除kong配置信息
     *
     * @param ids 需要删除的kong配置信息主键
     * @return 结果
     */
    @Override
    public int deleteKongxSystemProfileByIds(Long[] ids) {
        return kongxSystemProfileMapper.deleteKongxSystemProfileByIds(ids);
    }

    /**
     * 删除kong配置信息信息
     *
     * @param id kong配置信息主键
     * @return 结果
     */
    @Override
    public int deleteKongxSystemProfileById(Long id) {
        return kongxSystemProfileMapper.deleteKongxSystemProfileById(id);
    }


    /**
     * 根绝配置文件信息  连接kong 服务器
     *
     * @param kongxSystemProfile
     * @return
     */
    @Override
    public int activeKongServerByProfile(KongxSystemProfile kongxSystemProfile) {
        KongxSystemProfile _kongProfile = StringUtils.cast(redisCache.getCacheObject(getKongCacheKey()));
        if(!ObjectUtils.isEmpty(_kongProfile)){
            // 判断 是否激活 kong 连接一样
            if(!kongxSystemProfile.getUrl().equalsIgnoreCase(_kongProfile.getUrl())){
                throw new KongServiceException("已存在已激活服务，请先停止在激活");
            }

        }
        // 激活数据 存储缓存中
        redisCache.setCacheObject(getKongCacheKey(), kongxSystemProfile);
        // 请求kong 配置信息
        try {
            Map map = KongClientService.getInstance(kongxSystemProfile.getUrl()).kongInfo();
            if (CollectionUtils.isEmpty(map)) {
                return -1;
            }
            // 去kong版本号
            String kongVer = map.get("version").toString();
            kongxSystemProfile.setVersion(kongVer);
            kongxSystemProfile.setActiveTime(DateUtils.getNowDate());
            kongxSystemProfile.setActive("ACTIVE");
            kongxSystemProfileMapper.updateKongxSystemProfile(kongxSystemProfile);
        } catch (Exception e) {
            return -1;
        }
        return 1;
    }

    /**
     * 停止 kong 激活
     *
     * @param kongxSystemProfile
     * @return
     */
    public String stopKongServerByProfile(KongxSystemProfile kongxSystemProfile) {
        // 获取缓存信息
        KongxSystemProfile _kongProfile = StringUtils.cast(redisCache.getCacheObject(getKongCacheKey()));
        if(ObjectUtils.isEmpty(_kongProfile)){
            throw new KongServiceException("无法获取已激活的服务！！");
        }
        if (_kongProfile.getUrl().equalsIgnoreCase(kongxSystemProfile.getUrl())) {
            if (redisCache.deleteObject(getKongCacheKey())) {
                kongxSystemProfile.setActive("STOP");
                kongxSystemProfileMapper.updateKongxSystemProfile(kongxSystemProfile);
                return "已成功停止";
            } else {
                return "已激活kong Url 与当前请求停止Url 不一致，无法处理停止请求";
            }
        }
        return "无法处理停止操作";
    }

    /**
     * 从缓存中获取kongx 的配置行
     *
     * @return
     */
    @Override
    public KongxSystemProfile getKongxSysProfileFormCache() {
        Object cacheObject = redisCache.getCacheObject(getKongCacheKey());
        if (!ObjectUtils.isEmpty(cacheObject)) {
            KongxSystemProfile kongxSystemProfile = StringUtils.cast(cacheObject);
            return kongxSystemProfile;
        }
        return null;
    }

}
